// index.js
Page({
  data: {
    enterTime: 0, // 进入时间戳
    isEnglishHidden: true,
    userInput: '',
    showingDetail: false,
    isCorrect: false,
    isWrong: false,
    enableInput: true,
    wordsToReviews: [],
    currentWord: {
      _id: '',
      word: '',
      word_id: '',
      pronunciation: '',
      translation: '',
      sound_url: '',
      formattedBlanks: ''
    },
    currentWordIndex: 0
  },
  formatBlanks: function(word) {
    // 根据word的长度拼接_, 以空格隔开，比如word长度为5，返回_ _ _ _ _
    return Array(word.length).fill('_').join(' ');
  },
  wasCorrect: function(wordObj) {
    // 判断wordObj.word 是否等于 wordObj.formattedBlanks去掉所有空格后的字符串
    return wordObj.word == wordObj.formattedBlanks.replace(/\s+/g, '');
  },
  onShow: function() {
    // 记录进入时间
    this.setData({
        enterTime: Date.now()
    })
    if (this.data.wordsToReviews.length == 0) {
      this.getWordsToReviewFuc()
    } else {
      this.setData({
        currentWord: this.data.wordsToReviews[this.data.currentWordIndex]
      })
    }
  },
  // 调用云函数获取待复习单词
  async getWordsToReviewFuc() {
    try {
      // 调用云函数wordsFunctions的getWordsToReview，用于获取待复习的单词（一次获得10个）
      const result = await wx.cloud.callFunction({
        name: 'wordsFunctions', 
        data: {
          type: 'getWordsToReview'
        }
      })
      if (result.result && result.result.success) {
        if (result.result.data.length == 0) {
          wx.showToast({
            title: '暂无需要复习的单词',
            icon: 'none'
          })
          return;
        }
        // 对于result.result.data数组，每个数组项都要新增一个formattedBlanks属性
        const wordsWithBlanks = result.result.data.map(word => ({
          ...word,
          formattedBlanks: this.formatBlanks(word.word)
        }))
        // 将res.result.data附加到wordsToReviews末尾，不用...语法，用concat方法
        const updatedWords = this.data.wordsToReviews.concat(wordsWithBlanks)
        if (this.data.currentWordIndex > 0) {
          this.data.currentWordIndex = this.data.currentWordIndex + 1;
        }
        this.setData({
          wordsToReviews: updatedWords,
          currentWord: updatedWords[this.data.currentWordIndex]
        })
      } else {
        console.error('获取单词失败:', result.result.message);
      }
    } catch (error) {
      console.error('调用云函数失败:', error);
    }
  },
  // 复习完成
  async reviewComplete() {
    try {
      // 调用云函数wordsFunctions的studyWord，用于更新单词的复习时间
      const result = await wx.cloud.callFunction({
        name: 'wordsFunctions', 
        data: {
          type: 'reviewWord',
          word: this.data.currentWord.word
        }
      })
      if (result.result && result.result.success) {
        // 复习完成，但是不用更新当前复习数组，因为下一次点击进来就没了，每次都是刷新获取10个待复习单词
        console.log('复习单词成功：'+this.data.currentWord.word);
      } else {
        console.error('更新单词复习状态失败:', result.result.message);
      }
    } catch (error) {
      console.error('调用云函数失败:', error);
    }
  },

  // 页面隐藏时触发
  onHide: function() {
    // 计算停留时长（分钟）
    const duration = Math.floor((Date.now() - this.data.enterTime) / 60000)
    
    // 获取原有存储值并累加
    const current = wx.getStorageSync('todayStudyMin') || 0
    wx.setStorageSync('todayStudyMin', current + duration)
  },

  onUnload: function() {
    // 页面卸载时也触发计算（用户直接返回）
    this.onHide()
  },
  // 返回上一页
  goBack: function() {
    wx.navigateBack();
  },
  
  // 输入处理
  onInput: function(e) {
    let inputWd = e.detail.value;
    // 刷新当前单词的formattedBlanks
    const { currentWord } = this.data;
    // 如果inputWd等于currentWord.word，则弹出提示“正确”，同时禁用输入
    if (inputWd === currentWord.word) {
      // wx.showToast({
      //   title: '正确',
      //   icon: 'none'
      // })
      this.setData({
        enableInput: false
      })
      this.reviewComplete();
    }
    // 将inputWd转换为每个字母的数组，然后看长度是否小于currentWord.word.length
    // 如果小，则补充_
    const iptWdArr = inputWd.split('');
    if (iptWdArr.length < currentWord.word.length) {
      iptWdArr.push(...Array(currentWord.word.length - iptWdArr.length).fill('_'))
    }
    inputWd = iptWdArr.join(' ');
    if (inputWd.length > currentWord.formattedBlanks.length) {
      // 报错超出长度了
      wx.showToast({
        title: '字母超出长度',
        icon: 'none'
      })
    }
    currentWord.formattedBlanks = inputWd;
    this.setData({
      userInput: e.detail.value,
      currentWord: currentWord
    })
  },
  
  // 确认输入
  onConfirm: function() {
    const { userInput, isEnglishHidden, currentWord } = this.data;
    const expected = isEnglishHidden ? currentWord.english : currentWord.chinese;
    
    if (userInput.trim() === expected) {
      this.setData({
        isCorrect: true,
        isWrong: false
      });
    } else {
      this.setData({
        isCorrect: false,
        isWrong: true
      });
    }
  },
  
  // 显示详情
  showDetail: function() {
    this.setData({
      showingDetail: true
    });
  },
  
  // 上一个单词
  prevWord: function() {
    // 先判断是否还有上一个单词
    if (this.data.currentWordIndex > 0) {
      this.resetState();
      const idx = this.data.currentWordIndex - 1;
      this.setData({
        currentWordIndex: idx,
        currentWord: this.data.wordsToReviews[idx],
        enableInput: !this.wasCorrect(this.data.wordsToReviews[idx])
      })
    } else {
      wx.showToast({
        title: '没有上一个单词了',
        icon: 'none'
      });
    }
  },
  
  // 下一个单词
  nextWord: function() {
    // 先判断是否还有下一个单词
    if (this.data.currentWordIndex < this.data.wordsToReviews.length - 1) {
      this.resetState();
      const idx = this.data.currentWordIndex + 1;
      this.setData({
        currentWordIndex: idx,
        currentWord: this.data.wordsToReviews[idx],
        enableInput: !this.wasCorrect(this.data.wordsToReviews[idx])
      })
    } else {
      wx.showToast({
        title: '正在加载下一组单词',
        icon: 'none'
      });
      // 调用云函数获取下一组单词
      this.getWordsToReviewFuc();
    }
  },
  
  // 单词语音
  playSound: function() {
    if (this.data.currentWord.sound_url) {
      const innerAudioContext = wx.createInnerAudioContext();
      innerAudioContext.src = this.data.currentWord.sound_url;
      innerAudioContext.play();
    }
  },

  // 重置状态
  resetState: function() {
    this.setData({
      userInput: '',
      showingDetail: false,
      isCorrect: false,
      isWrong: false,
      enableInput: true
    });
  }
});